//designpatterns.proxy.dynamic.Client.java
package org.patterns.structural.proxy.dynamic;

import java.lang.reflect.Proxy;
import java.lang.reflect.InvocationHandler;

public class Client {
    public static void main(String[] args) {
        // 创建一个InvocationHandler实例，用于处理代理对象上的方法调用
        InvocationHandler handler = null;
        // 创建一个UserDAO实例，作为真实主题对象
        AbstractUserDAO userDAO = new UserDAO();
        // 创建一个DAOLogHandler实例，包装UserDAO对象，以便在方法调用前后添加日志功能
        handler = new DAOLogHandler(userDAO);
        // 动态创建代理对象，用于代理UserDAO对象
        AbstractUserDAO userDAOProxy = (AbstractUserDAO) Proxy.newProxyInstance(AbstractUserDAO.class.getClassLoader(), new Class[]{AbstractUserDAO.class}, handler);
        System.out.println("代理对象：" + userDAOProxy.getClass().getName());
        // 调用代理对象的业务方法，实际调用会被转发到DAOLogHandler对象，并在调用前后添加日志
        userDAOProxy.findUserById("张无忌");

        // 打印分隔线，区分不同的代理对象操作
        System.out.println("------------------------------");

        // 创建一个DocumentDAO实例，作为另一个真实主题对象
        AbstractDocumentDAO docDAO = new DocumentDAO();
        // 创建一个DAOLogHandler实例，包装DocumentDAO对象，以便在方法调用前后添加日志功能
        handler = new DAOLogHandler(docDAO);
        // 动态创建代理对象，用于代理DocumentDAO对象
        AbstractDocumentDAO docDAOProxy = (AbstractDocumentDAO) Proxy.newProxyInstance(AbstractDocumentDAO.class.getClassLoader(), new Class[]{AbstractDocumentDAO.class}, handler);
        System.out.println("代理对象：" + docDAOProxy.getClass().getName());
        // 调用代理对象的业务方法，实际调用会被转发到DAOLogHandler对象，并在调用前后添加日志
        docDAOProxy.deleteDocumentById("D002");

    }
}
